/**
 * @file QWF_Cmd.h
 * @brief 总命令配置头文件（集中管理系统功能开关、电机参数配置及校验规则）
 * @author WeiFan Qiu (qiuweifan0523@faxmail.com)
 * @version 1.0
 * @date 2025-08-07
 * 
 * @copyright Copyright (c) 2025 邱伟凡
 * 
 * @par 修改日志:
 * - 2025-08-07: 初始版本，定义系统功能开关、电机配置参数及校验规则
 * 
 * @bug 待解决问题:
 * - 需验证Leg_Wheel类型底盘的电机配置兼容性
 */
#ifndef QWF_CMD_H
#define QWF_CMD_H
/****************************************操作修改***********************************************************/
#include "QWF_Custom_Ctrl.h"  // 包含自定义控制逻辑头文件
#include "QWF_Include.h"      // 包含系统通用头文件

/*功能启用/禁用标记（1:启用，0:禁用）*/
#define QWF_Enable	1
#define QWF_Disable	0

/*----------------------------------------功能选择---------------------------------------------------------*/
#define debug						QWF_Enable			// 启用调试功能（输出调试日志）
#define use_judge					QWF_Enable			// 启用裁判系统通信（接收比赛状态）

/******************************************底盘************************************************************/
#define use_power_ctrl				QWF_Enable	// 启用功率控制（限制底盘总功率）
#define use_super_elec				QWF_Enable	// 启用超电容管理（优化能量分配）
#define use_power_get				QWF_Disable	// 禁用功率计（不读取外部功率传感器）

/******************************************云台************************************************************/
#define use_pitch_g_add				QWF_Enable // 启用pitch轴重力补偿（抵消机械臂自重影响）
#define use_yaw_f_add				QWF_Disable // 禁用yaw轴摩擦力补偿（当前机械结构无需补偿）

/*----------------------------------------电机设置---------------------------------------------------------*/
/******************************************底盘************************************************************/
/*底盘轮子类型定义（需在外部头文件中定义Chassis_Wheel_Type）*/
#ifndef Chassis_Wheel_Type
	#error "Undefine 'Chassis_Wheel_Type'"  // 未定义底盘类型时报错
#endif
/**
 * @brief 电机配置宏（简化电机结构体初始化）
 * @param motor_str: 电机结构体成员名
 * @param config_name: 配置参数前缀（如f_helm）
 * @param config_mode: 控制模式（如Only_tx,Only_rx,tx_and_rx）
 */
#define motor_str_config(motor_str,config_name,config_mode)	.motor_str={\
																		.config={\
																			.type=config_name##_type,	  	/* 电机类型（如DJI_gm6020_new_i）*/	\
																			.mode=config_mode,        		/* 控制模式*/						\
																			.ID=config_name##_id,	      	/* 电机ID（1-7）*/					\
																			.can=config_name##_can,},   	/* 通信CAN总线（1-2）*/				\
																		.rx_meas.angle_begin=config_name##_angle_begin/*初始角度*/,},			\

#if Chassis_Wheel_Type==Helf_Helm_Wheel  // 半舵轮底盘配置
#define f_helm_id				4//前轮舵向电机ID
#define	f_wheel_id				4//前轮驱动电机ID

#define b_helm_id				3//后轮舵向电机ID
#define	b_wheel_id				3//后轮驱动电机ID

#define l_wheel_id				2//左轮驱动电机ID
#define	r_wheel_id				1//右轮驱动电机ID

/*底盘CAN总线分配（1:CAN1，2:CAN2）*/
#define f_helm_can				1//前轮舵向电机通信CAN
#define	f_wheel_can				1//前轮驱动电机通信CAN

#define b_helm_can				1//后轮舵向电机通信CAN
#define	b_wheel_can				1//后轮驱动电机通信CAN

#define l_wheel_can				1//左轮驱动电机通信CAN
#define	r_wheel_can				1//右轮驱动电机通信CAN

/*电机类型（对应DJI电调协议）*/
#define f_helm_type				DJI_gm6020_new_i  // 前轮舵向电机类型
#define b_helm_type				DJI_gm6020_new_i  // 后轮舵向电机类型

#define f_wheel_type			DJI_c620          // 前轮驱动电机类型
#define b_wheel_type			DJI_c620          // 后轮驱动电机类型
#define l_wheel_type			DJI_c620          // 左轮驱动电机类型
#define r_wheel_type			DJI_c620          // 右轮驱动电机类型

/*电机初始角度（单位：编码器值，0-8191）*/
#define f_helm_angle_begin			(int16_t)(2438)/*4154*/  // 前轮舵向电机初始角度
#define b_helm_angle_begin			(int16_t)(1237)/*2674*/  // 后轮舵向电机初始角度

#define f_wheel_angle_begin			(int16_t)(0)/*4154*/     // 前轮驱动电机初始角度
#define b_wheel_angle_begin			(int16_t)(0)/*2674*/     // 后轮驱动电机初始角度
#define l_wheel_angle_begin			(int16_t)(0)/*4154*/     // 左轮驱动电机初始角度
#define r_wheel_angle_begin			(int16_t)(0)/*2674*/     // 右轮驱动电机初始角度
#elif 	(Chassis_Wheel_Type==Omni_Wheel)||(Chassis_Wheel_Type==Mecanum_Wheel)  // 全向轮/麦克纳姆轮底盘配置
#define	lf_wheel_id				1//左前轮驱动电机ID
#define	rf_wheel_id				2//右前轮驱动电机ID
#define	lb_wheel_id				3//左后轮驱动电机ID
#define	rb_wheel_id				4//右后轮驱动电机ID

#define	lf_wheel_can			1//左前轮驱动电机ID
#define	rf_wheel_can			2//右前轮驱动电机ID
#define	lb_wheel_can			3//左后轮驱动电机ID
#define	rb_wheel_can			4//右后轮驱动电机ID

#define lf_wheel_type			DJI_c620  // 左前轮驱动
#define rf_wheel_type			DJI_c620  // 右前轮驱动
#define lb_wheel_type			DJI_c620  // 左后轮驱动
#define rb_wheel_type			DJI_c620  // 右后轮驱动

#define	lf_wheel_angle_begin	1//左前轮驱动电机ID
#define	rf_wheel_angle_begin	2//右前轮驱动电机ID
#define	lb_wheel_angle_begin	3//左后轮驱动电机ID
#define	rb_wheel_angle_begin	4//右后轮驱动电机ID
#elif	Chassis_Wheel_Type==Leg_Wheel  // 腿轮式底盘配置（预留）
/*电机id（待补充具体值）*/
#define lf_knot_id				1
#define rf_knot_id				1
#define lb_knot_id				1
#define rb_knot_id				1
#define l_wheel_id				1
#define r_wheel_id				1

/*电机类型（待补充具体型号）*/
#define lf_knot_type			
#define rf_knot_type
#define lb_knot_type
#define rb_knot_type
#define l_wheel_type
#define r_wheel_type
#endif

/******************************************云台************************************************************/
/*云台电机ID（1-7）*/
#define pitch_id			2		// pitch轴电机ID
#define yaw_id				1		// yaw轴电机ID
#define knob_id				1		// 拨盘电机ID
#define	fire_l_id			1		// 左摩擦轮电机ID
#define	fire_r_id			4		// 右摩擦轮电机ID

/*云台CAN总线分配*/
#define pitch_can			1		// pitch轴通信CAN
#define yaw_can				2		// yaw轴通信CAN
#define knob_can			2		// 拨盘通信CAN
#define	fire_l_can			1		// 左摩擦轮通信CAN
#define	fire_r_can			1		// 右摩擦轮通信CAN

/*电机类型（对应DJI电调协议）*/
#define pitch_type		DJI_gm6020_new_i		// pitch轴电机类型
#define yaw_type		DJI_gm6020_new_i		// yaw轴电机类型
#define knob_type			DJI_c620			// 拨盘电机类型
#define	fire_l_type			DJI_c620			// 左摩擦轮电机类型
#define	fire_r_type			DJI_c620			// 右摩擦轮电机类型

/*电机初始角度（单位：编码器值，0-8191）*/
#define pitch_angle_begin		(int16_t)(0)          		// pitch轴初始角度
#define yaw_angle_begin			(int16_t)(169+4096)/*2674*/ // yaw轴初始角度(用于底盘跟随)
#define knob_angle_begin		(int16_t)(0)				// 拨盘初始角度
#define	fire_l_angle_begin		(int16_t)(0)          		// 左摩擦轮初始角度
#define	fire_r_angle_begin		(int16_t)(0)          		// 右摩擦轮初始角度

/*-----------------------------------------遥控器优先级------------------------------------------------*/
/***************************************检验层***************************************** */
/**
 * @brief 电机ID合法性校验（确保所有电机ID在1-7范围内）
 * 若任意电机ID超出范围，编译报错提示
 */
//#if ((f_helm_id>7||f_helm_id<1)||(f_wheel_id>7||f_wheel_id<1)||(b_helm_id>7||b_helm_id<1)||(b_wheel_id>7||b_wheel_id<1)||(l_wheel_id>7||l_wheel_id<1)||(r_wheel_id>7||r_wheel_id<1)||\
//	(pitch_id>7||pitch_id<1)||(yaw_id>7||yaw_id<1)||(fire_l_id>7||fire_l_id<1)||(fire_r_id>7||fire_r_id<1)||(knob_id>7||knob_id<1))
//	#error "The DJI mottor's ID can only in[1,7]"
//#endif

#endif
